#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
int main() 
{
    pid_t id = fork();
    if(id == 0) 
    {
        //子进程
        int cnt = 10;
        while(cnt)
        {
            printf("我是子进程：%d,父进程：%d,cnt: %d\n",getpid(),getppid(),cnt--);
            sleep(1);
        }
        exit(-1); //进程退出 退出码自己定
    }
    //父进程
    int status = 0;
    while(1) 
    {
        pid_t ret = waitpid(id, &status,WNOHANG);//WNOHANG:非阻塞等待-> 子进程没有退出，父进程检测时候，立即返回
        if(ret == 0)
        {
            //waitpid调用成 && 子进程没退出
            //子进程没有退出，我的waitpid没有等待失败，仅仅检测了子进程没退出
            //做其它。。。
            printf("wait done,but child is running...\n");
        }else if(ret >0)
        {
            //waitpid调用成功 && 子进程退出了
            printf("wait success, exit code:%d,sig: %d\n",(status>>8)&0xFF,status & 0x7F);
            break;
        }else 
        {
            //waitpid 调用失败
            printf("waitpid call failed\n");
            break;
        }
        sleep(3);
    }  
    return 0;
}
//int main() 
//{
//    pid_t id = fork();
//    if(id == 0) 
//    {
//        //子进程
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("我是子进程：%d,父进程：%d,cnt: %d\n",getpid(),getppid(),cnt--);
//            sleep(1);
//        }
//        exit(0); //进程退出 退出码自己定
//    }
//    //父进程
//    // sleep(15);
//    //pid_t ret = wait(NULL);
//    int status = 0;
//    //1.让OS释放子进程的僵尸状态
//    //2.获取子进程的退出结果
//    //在等待期间，子进程没有退出的时候，父进程只能阻塞等待
//    pid_t ret = waitpid(id,&status, 0); //阻塞式等待
//    if(ret > 0)
//    {
//        //是否正常退出
//        if(WIFEXITED(status)) 
//        {
//            //判断子进程运行结果是否ok
//            printf("eixt code: %d\n",WEXITSTATUS(status));
//        }else
//        {
//            //其它比如拿到子进程的信息
//            printf("child eixt not normal\n");
//        }
//       // printf("wait success:%d, sig number: %d,child exit code:%d\n",ret, (status & 0x7F),(status >> 8)&0xFF );
//    }
//    sleep(5);
//    return 0;
//}


//int addToTarget(int from,int to) 
//{
//    int sum = 0;
//    for(int i = from; i< to; ++i) 
//    {
//        sum += i;
//    }
//   // return sum;
//   _exit(31);
//}
//int main() 
//{
//    printf("hello");
//    sleep(2);
//    _exit(1);
   // printf("hello\n");
   // int ret = addToTarget(1,100);
   // printf("sum = %d\n",ret);
   // while(1) sleep(1);
    //for(int i = 0; i< 200; ++i) 
    //{
    //    printf("%d : %s\n",i,strerror(i));
    //}
    //写代码是为了完成某件事情，我如何得知我的任务完成的如何？？
    //进程退出码
    //int num = addToTarget(1,100);
    //if(num == 5050)
    //    return 0;
    //else 
    //    return 1;
    //进程退出的时候，对应的退出码
    //标定进程退出的时候结果是否正确
    //return 0;
//}
//int global_value = 200;
//int main() 
//{
//    pid_t id =  fork();
//    if(id < 0)
//    {
//        printf("fork error\n");
//        return 1;
//    }
//    else if(id == 0) 
//    {
//        //子进程
//        int cnt  = 0;
//        while(1) 
//        {
//            printf("我是子进程，pid：%d,ppid:%d | global_value:%d,&global_value:%p\n",getpid(),getppid(),global_value,&global_value);
//            sleep(1);
//            cnt++;
//            if(cnt == 8) 
//            {
//                global_value = 500;
//                printf("子进程已经改变了全局变量..........\n");
//            }
//        }
//    }
//   else 
//    {
//        //父进程
//         while(1) 
//        {
//             printf("我是父进程，pid：%d,ppid:%d | global_value:%d,&global_value:%p\n",getpid(),getppid(),global_value,&global_value);
//             sleep(2);
//        }
//    }
//    return 0;
//}
